From c10b6b7297f04605fe4e15e9b5af25b1b7f27132 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 2 Dec 2015 15:40:44 +0100 Subject: [PATCH] dnd: Add gtk_image_set_from_definition() ... and use it in the DND code, thereby getting rid of the icon helper. --- gtk/gtkdnd.c | 58 ++++++------------------------------------- gtk/gtkimage.c | 27 ++++++++++++++++++++ gtk/gtkimageprivate.h | 4 +++ 3 files changed, 38 insertions(+), 51 deletions(-) diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c index 0f803f65ce..fb6c1ab35b 100644 --- a/gtk/gtkdnd.c +++ b/gtk/gtkdnd.c @@ -24,6 +24,9 @@ #include "config.h" +#include "gtkdnd.h" +#include "gtkdndprivate.h" + #include #include #include @@ -43,17 +46,15 @@ #include #endif -#include "gtkdnd.h" -#include "gtkdndprivate.h" #include "gtkgesturedrag.h" #include "gtkgesturesingle.h" -#include "gtkiconhelperprivate.h" #include "gtkicontheme.h" +#include "gtkimageprivate.h" +#include "gtkintl.h" #include "gtkmain.h" #include "gtkplug.h" #include "gtktooltipprivate.h" #include "gtkwindow.h" -#include "gtkintl.h" #include "gtkrender.h" #include "gtkselectionprivate.h" #include "gtkwindowgroup.h" @@ -114,7 +115,6 @@ struct _GtkDragSourceInfo GList *selections; /* selections we've claimed */ GtkDragDestInfo *proxy_dest; /* Set if this is a proxy drag */ - GtkIconHelper *icon_helper; guint update_idle; /* Idle function to update the drag */ guint drop_timeout; /* Timeout for aborting drop */ @@ -2352,7 +2352,7 @@ gtk_drag_begin_internal (GtkWidget *widget, * application may have set one in ::drag_begin, or it may * not have set one. */ - if (!info->icon_widget && !info->icon_helper) + if (!info->icon_widget) { if (icon) { @@ -2366,27 +2366,6 @@ gtk_drag_begin_internal (GtkWidget *widget, } } - /* We need to composite the icon into the cursor, if we are - * not using an icon window. - */ - if (info->icon_helper) - { - cursor = gtk_drag_get_cursor (widget, - gtk_widget_get_display (widget), - suggested_action, - info); - - if (cursor != info->cursor) - { - gdk_device_grab (pointer, gtk_widget_get_window (widget), - GDK_OWNERSHIP_APPLICATION, FALSE, - GDK_POINTER_MOTION_MASK | - GDK_BUTTON_RELEASE_MASK, - cursor, time); - info->cursor = cursor; - } - } - info->cur_x = info->start_x; info->cur_y = info->start_y; @@ -2572,8 +2551,6 @@ gtk_drag_set_icon_window (GdkDragContext *context, gtk_container_add (GTK_CONTAINER (info->icon_window), widget); - g_clear_object (&info->icon_helper); - out: gtk_drag_update_cursor (info); } @@ -2623,32 +2600,12 @@ set_icon_helper (GdkDragContext *context, gint hot_x, gint hot_y) { - GtkDragSourceInfo *info; GtkWidget *widget; - GdkScreen *screen; - cairo_surface_t *source; - GdkWindow *root; - - info = gtk_drag_get_source_info (context, FALSE); - screen = gdk_window_get_screen (gdk_drag_context_get_source_window (context)); - - if (info->icon_helper == NULL) - { - info->icon_helper = _gtk_icon_helper_new (); - _gtk_icon_helper_set_window (info->icon_helper, gdk_drag_context_get_source_window (context)); - } - _gtk_icon_helper_set_definition (info->icon_helper, def); - _gtk_icon_helper_set_icon_size (info->icon_helper, GTK_ICON_SIZE_DND); widget = gtk_image_new (); gtk_widget_show (widget); - root = gdk_screen_get_root_window (screen); - source = gtk_icon_helper_load_surface (info->icon_helper, - gtk_widget_get_style_context (widget), - gdk_window_get_scale_factor (root)); - gtk_image_set_from_surface (GTK_IMAGE (widget), source); - cairo_surface_destroy (source); + gtk_image_set_from_definition (GTK_IMAGE (widget), def, GTK_ICON_SIZE_DND); gtk_drag_set_icon_window (context, widget, hot_x, hot_y, TRUE); } @@ -3323,7 +3280,6 @@ static void gtk_drag_source_info_destroy (GtkDragSourceInfo *info) { gtk_drag_remove_icon (info); - g_clear_object (&info->icon_helper); g_signal_handlers_disconnect_by_func (info->ipc_widget, gtk_drag_grab_broken_event_cb, diff --git a/gtk/gtkimage.c b/gtk/gtkimage.c index 30b634cdf9..7a2f33fcfe 100644 --- a/gtk/gtkimage.c +++ b/gtk/gtkimage.c @@ -1771,6 +1771,33 @@ gtk_image_notify_for_storage_type (GtkImage *image, } } +void +gtk_image_set_from_definition (GtkImage *image, + GtkImageDefinition *def, + GtkIconSize icon_size) +{ + GtkImagePrivate *priv; + + g_return_if_fail (GTK_IS_IMAGE (image)); + + priv = image->priv; + + g_object_freeze_notify (G_OBJECT (image)); + + gtk_image_clear (image); + + if (def != NULL) + { + _gtk_icon_helper_set_definition (priv->icon_helper, def); + + gtk_image_notify_for_storage_type (image, gtk_image_definition_get_storage_type (def)); + } + + _gtk_icon_helper_set_icon_size (priv->icon_helper, icon_size); + + g_object_thaw_notify (G_OBJECT (image)); +} + static void gtk_image_reset (GtkImage *image) { diff --git a/gtk/gtkimageprivate.h b/gtk/gtkimageprivate.h index c734ee81a5..210d1f3a02 100644 --- a/gtk/gtkimageprivate.h +++ b/gtk/gtkimageprivate.h @@ -27,10 +27,14 @@ #include "gtkimage.h" +#include "gtkimagedefinitionprivate.h" G_BEGIN_DECLS +void gtk_image_set_from_definition (GtkImage *image, + GtkImageDefinition *def, + GtkIconSize size); G_END_DECLS -- 2.30.2